package com.liuqi.openai.core.completion;

import com.liuqi.openai.core.shared.StreamOptions;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

/**
 * openai api /completions 的请求内容
 *
 * @author liuqi
 * @date 2025/7/18
 **/
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class CompletionRequest {

    /**
     * ai 模型
     */
    private String model;

    /**
     * 请求
     */
    private String prompt;

    /**
     * 后缀
     */
    private String suffix;

    /**
     * 本次请求返回的最大 Token 数。
     */
    private Integer maxTokens;

    /**
     * 采样温度，控制模型生成文本的多样性。
     */
    private Float temperature;

    /**
     * 核采样的概率阈值，控制模型生成文本的多样性。
     *
     * top_p越高，生成的文本更多样。反之，生成的文本更确定
     */
    private Float topP;

    /**
     * 返回条目数
     */
    private Integer n;

    /**
     * 是否流式输出回复
     */
    private Boolean stream;

    /**
     * 当启用流式输出时，可通过将本参数设置为{"include_usage": true}，在输出的最后一行显示所使用的Token数
     */
    private StreamOptions streamOptions;


    /**
     * 当模型生成的文本即将包含stop参数中指定的字符串或token_id时，将自动停止生成。
     *
     * 您可以在stop参数中传入敏感词来控制模型的输出。
     */
    private List<String> stop;

    /**
     * 设置seed参数会使文本生成过程更具有确定性，通常用于使模型每次运行的结果一致
     */
    private Integer seed;

    /**
     * 控制模型生成文本时的内容重复度。
     *
     * 取值范围：[-2.0, 2.0]。正数会减少重复度，负数会增加重复度。
     */
    private Float presencePenalty;

    /**
     * 基于词汇出现频率进行惩罚, 对重复出现的词惩罚更强, 减少高频重复词汇
     */
    private Float frequencyPenalty;

}
